package com.fs.warehouse.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fs.common.core.page.PageDomain;
import com.fs.common.core.pojo.Product;
import com.fs.procure.pojo.Insto;
import com.fs.procure.vo.InstoVo;
import com.fs.warehouse.pojo.*;
import com.fs.warehouse.vo.DefectiveProductVo;
import com.fs.warehouse.vo.InventoryVo;
import com.fs.warehouse.vo.WarehousingVo;

import java.util.Date;
import java.util.List;


public interface WarehouseService {
    /**
     * 指定员工入库
     * @param inStoId 入库申请
     * @param userName 入库人姓名
     */
    void designatedEmployeeInv(String inStoId, String userName);

    /**
     * 获得所有仓库名
     * @return
     */
    List<WhWarehouse> getAllWarehouse();

    /**
     * 发起库存盘点
     * @param warehouseId 仓库id
     * @param inventoryTaKerId 盘点人id
     * @param inventoryTime 盘点时间
     * @param products 盘点的商品
     */
    void initiateInventory(Integer warehouseId, Integer inventoryTaKerId, Date inventoryTime, List<Product> products);

    /**
     * 生成入库单
     * @param warehousingVo 入库单的值对象
     */
    void generateWarehousing(WarehousingVo warehousingVo);

    /**
     * 查找所有入库申请集合
     * @param pageDomain 分页格式
     * @param warehousingVo 入库申请值对象
     * @return 分页对象
     */
    Page<WhWarehousing> selectWarehousingList(PageDomain pageDomain, WarehousingVo warehousingVo);

    /**
     * 查看所有入库申请
     * @param pageDomain 分页格式
     * @param instoVo 入库申请vo对象
     * @return 分页对象
     */
    Page<Insto> selectWarehousingApplication(PageDomain pageDomain, InstoVo instoVo);

    /**
     * 查看入库单
     * @param pageDomain 分页格式
     * @param inventoryVo 入库单vo对象
     * @return 分页对象
     */
    Page<WhInvInventory> selectInventory(PageDomain pageDomain, InventoryVo inventoryVo);

    WhInvInventory updateStatus(WhInvInventory invInventory);

    WhInvInventory fillInventoryDetail(List<WhInvInventoryDetail> invInventoryDetail);

    void submitDefectiveApplication(List<WhDefectiveHandleApplication> defectiveHandle);

    Page<DefectiveProductVo> selectDefectiveApplication(PageDomain pageDomain,DefectiveProductVo defectiveProductVo);

    void updateDefectiveStatus(DefectiveProductVo defectiveProductVo);

    void generateOutbound(WhOutbound outbound);
    List<WarehousingVo> selectWarehousing();
}
